package part2;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: shaochong
 * @Date: 2021/8/15
 * @Description:
 *给定一个非空整数数组，除了某个元素只出现一次以外，其余每个元素均出现两次。找出那个只出现了一次的元素。
 *
 * 异或运算有以下三个性质。
 *
 * 任何数和 00 做异或运算，结果仍然是原来的数，即 a \oplus 0=aa⊕0=a。
 * 任何数和其自身做异或运算，结果是 00，即 a \oplus a=0a⊕a=0。
 * 异或运算满足交换律和结合律，即 a \oplus b \oplus a=b \oplus a \oplus a=b \oplus (a \oplus a)=b \oplus0=ba⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。
 *
 * 作者：LeetCode-Solution
 * 链接：https://leetcode-cn.com/problems/single-number/solution/zhi-chu-xian-yi-ci-de-shu-zi-by-leetcode-solution/
 * 来源：力扣（LeetCode）
 * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
 */
public class Solution136 {


    /**
     * 使用异或
     * 空间: O(1)
     * 时间: O(n)
     * @param nums
     * @return
     */
    public int singleNumber(int[] nums) {
        int ans = 0;
        for (int v : nums) {
            ans ^= v;
        }
        return ans;
    }


    /**
     * 使用hash
     * 空间: O(n)
     * 时间: O(n)
     * @param nums
     * @return
     */
    public int singleNumber2(int[] nums) {
        Map<Integer, Character> map = new HashMap<>();
        for (int v : nums) {
            if (map.containsKey(v)) {
                map.remove(v);
            } else {
                map.put(v, '1');
            }
        }
        int ans = 0;
        for (int k : map.keySet()) {
            ans = k;
        }
        return ans;
    }

}
